package com.system.cacheCenterBackend.service;

import java.util.*;
import java.util.concurrent.CompletableFuture;

/**
 * 缓存服务接口，定义CRUD操作
 */
public interface CacheService {

    /**
     * 设置缓存值
     *
     * @param key   键
     * @param value 值
     * @return 是否设置成功
     */
    boolean set(String key, String value);

    /**
     * 设置缓存值，带过期时间
     *
     * @param key     键
     * @param value   值
     * @param timeout 过期时间（秒）
     * @return 是否设置成功
     */
    boolean set(String key, String value, long timeout);

    /**
     * 获取缓存值
     *
     * @param key 键
     * @return 值
     */
    String get(String key);

    /**
     * 删除缓存值
     *
     * @param key 键
     * @return 是否删除成功
     */
    boolean delete(String key);

    /**
     * 检查缓存键是否存在
     *
     * @param key 键
     * @return 是否存在
     */
    boolean exists(String key);

    /**
     * 获取key的访问次数
     *
     * @param key 键
     * @return 访问次数
     */
    int getKeyAccessCount(String key);

    /**
     * 检查key是否为热点key
     *
     * @param key 键
     * @return 是否为热点key
     */
    boolean isHotKey(String key);

    /**
     * 重置key的访问统计
     *
     * @param key 键
     */
    void resetKeyStatistics(String key);

    /**
     * 异步获取key的访问次数
     *
     * @param key 键
     * @return 访问次数的CompletableFuture
     */
    CompletableFuture<Integer> getKeyAccessCountAsync(String key);
    
    /**
     * 获取Hash类型数据
     *
     * @param key 键
     * @return Hash数据
     */
    Map<String, String> getHash(String key);
    
    /**
     * 获取List类型数据
     *
     * @param key 键
     * @return List数据
     */
    List<String> getList(String key);
    
    /**
     * 获取Set类型数据
     *
     * @param key 键
     * @return Set数据
     */
    Set<String> getSet(String key);
    
    /**
     * 获取ZSet类型数据
     *
     * @param key 键
     * @return ZSet数据
     */
    Set<String> getZSet(String key);
    
    /**
     * 获取所有String类型的键
     *
     * @return String类型键集合
     */
    Set<String> getAllStringKeys();
    
    /**
     * 获取所有Hash类型的键
     *
     * @return Hash类型键集合
     */
    Set<String> getAllHashKeys();
    
    /**
     * 获取所有List类型的键
     *
     * @return List类型键集合
     */
    Set<String> getAllListKeys();
    
    /**
     * 获取所有Set类型的键
     *
     * @return Set类型键集合
     */
    Set<String> getAllSetKeys();
    
    /**
     * 获取所有ZSet类型的键
     *
     * @return ZSet类型键集合
     */
    Set<String> getAllZSetKeys();
}